#include <brpc/server.h>
#include <butil/logging.h>
#include "main.pb.h"
// 继承EchoService，并实现rpc调用的业务功能
class EchoServiceImpl : public example::EchoService
{
public:
    virtual void Echo(::google::protobuf::RpcController *controller,
                      const example::EchoRequest *request,
                      example::EchoResponse *response,
                      ::google::protobuf::Closure *done)
    {
        brpc::ClosureGuard done_guard(done);//echo就是客户端发给客户端要求远程处理的函数。按理说，会调用一个run()才会把结果发出去，但是为了忘了，可以用done_guard，这样函数结束会自动运行run()，类似智能指针
        std::cout <<"收到消息" <<request->message()<< std::endl;
        std::string str = "hello, " + request->message();
        response->set_message(str);
    }
};
int main()
{
    //关闭brpc的默认日志输出
    logging::LoggingSettings settings;
    settings.logging_dest = logging::LoggingDestination::LOG_TO_NONE;
    logging::InitLogging(settings);//固定套路了
    brpc::Server server;
    //向服务器对象中，添加服务。因为一个服务器其实可以提供多个服务
    EchoServiceImpl echo_service_impl;
    server.AddService(&echo_service_impl, brpc::SERVER_DOESNT_OWN_SERVICE);//因为是局部变量，因此不需要释放，因此我们设置成SERVER_DOESNT_OWN_SERVICE，表示“我们自己管理，不需要别人”
    brpc:: ServerOptions options;
    options.idle_timeout_sec = -1;//设置空闲超时时间,-1表示永远不关闭
    options.num_threads = 1;//设置线程数
    int ret = server.Start(8080, &options);//启动服务器，8080表示端口
    if(ret ==-1)
    {
        std::cout << "启动失败" << std::endl;
        return -1;
    }
    server.RunUntilAskedToQuit();//休眠等待客户端发送信息，然后就不断执行。
    return 0;
}